﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CreatingObjects3d
{
    [Serializable()]
    class ObjetoCono : Objeto
    {        
        private float radio;
        private float alto;
        private Boolean verParteInferior;
        private Boolean verLateral;

        /// <summary>
        /// Constructor principal de un objeto cono donde se indica su altura y el radio de su base.
        /// </summary>
        /// <param name="vAlto"></param>
        /// <param name="vRadio"></param>
        public ObjetoCono(float vAlto, float vRadio)
        {            
            base.tipoObjeto = "CONO";
            base.nombreObjeto = "CONO";
            alto = vAlto;
            radio = vRadio;
            verParteInferior = true;
            verLateral = true;
            base.colorObjeto = System.Drawing.Color.FromArgb(255, 255, 255);            
            base.escalaX = 1;
            base.escalaY = 1;
            base.escalaZ = 1;
            base.anguloRotacion = 0;
            base.ejeRotacion = 'x';
            base.colorInterior = System.Drawing.Color.FromArgb(255, 255, 255);            
            base.colorReflejo = System.Drawing.Color.FromArgb(255, 255, 255);            
            base.reflejoLuzAmbiental = 0;
            base.brillo = 0;
            base.transparencia = 0;
            base.rutaImagen = "";
            base.RutaImgagenOriginal = "";
        }

        public ObjetoCono(float vAlto, float vRadio, int numero)
        {            
            base.tipoObjeto = "CONO";
            base.nombreObjeto = "CONO" + numero;
            alto = vAlto;
            radio = vRadio;
            verParteInferior = true;
            verLateral = true;
            base.colorObjeto = System.Drawing.Color.FromArgb(255, 255, 255);
            base.escalaX = 1;
            base.escalaY = 1;
            base.escalaZ = 1;
            base.anguloRotacion = 0;
            base.ejeRotacion = 'x';
            base.colorInterior = System.Drawing.Color.FromArgb(255, 255, 255);
            base.colorReflejo = System.Drawing.Color.FromArgb(255, 255, 255);
            base.reflejoLuzAmbiental = 0;
            base.brillo = 0;
            base.transparencia = 0;
            base.rutaImagen = "";
            base.RutaImgagenOriginal = "";
        }

        #region Metodos Get y Set C#

        /// <summary>
        /// Asigna o devuelve la altura actual del cono.
        /// </summary>
        /// <returns></returns>
        public float Altura
        {
            get { return alto; }
            set { alto = value; }
        }
        

        /// <summary>
        /// Asigna o devuelve el radio para la base del cono.
        /// </summary>
        /// <param name="valorRadio"></param>
        public float Radio
        {
            get { return radio; }
            set { radio = value; }
        }

        /// <summary>
        /// Asgina o devuelve si la parte inferior del cono es visible.
        /// </summary>
        /// <param name="valorRadio"></param>
        public Boolean VisibilidadParteInferior
        {
            get { return verParteInferior; }
            set { verParteInferior = value; }
        }

        /// <summary>
        /// Asgina o devuelve si la parte lateral del cono es visible.
        /// </summary>
        /// <param name="valorRadio"></param>
        public Boolean VisibilidadParteLateral
        {
            get { return verLateral; }
            set { verLateral = value; }
        }        

        #endregion Metodos Get y Set C#

        public override string ToString()
        {
            String codigo;
            if (base.rutaImagen.Equals(""))
            {
                codigo = "Transform { translation" + String.Format(" {0} {1} {2} ", base.posicionX, base.posicionY, base.posicionZ);
                if (base.ejeRotacion == 'X')
                {
                    codigo += String.Format("rotation 1 0 0 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                else if (base.ejeRotacion == 'Y')
                {
                    codigo += String.Format("rotation 0 1 0 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                else if (base.ejeRotacion == 'Z')
                {
                    codigo += String.Format("rotation 0 0 1 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                else
                {
                    codigo += String.Format("rotation 1 0 0 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                codigo += String.Format("scale {0} {1} {2} ", base.escalaX, base.escalaY, base.escalaZ);
                codigo += "children	[ Shape{ appearance Appearance{	material Material { ";
                codigo += String.Format("diffuseColor {0} {1} {2} ", base.colorObjeto.R / 255f, base.colorObjeto.G / 255f, base.colorObjeto.B / 255f);
                codigo += String.Format("emissiveColor {0} {1} {2} ", base.colorInterior.R / 255f, base.colorInterior.G / 255f, base.colorInterior.B / 255f);
                codigo += String.Format("specularColor {0} {1} {2} ", base.colorReflejo.R / 255f, base.colorReflejo.G / 255f, base.colorReflejo.B / 255f);
                codigo += String.Format("ambientIntensity {0} ", base.reflejoLuzAmbiental);
                codigo += String.Format("shininess {0} ", base.brillo);
                codigo += String.Format("transparency {0} ", base.transparencia);
                codigo += "} } geometry Cone{ ";
                codigo += String.Format("height {0} ", alto);
                codigo += String.Format("bottomRadius {0} ", radio);
                if (verParteInferior)
                {
                    codigo += "bottom true ";
                }
                else
                {
                    codigo += "bottom false ";
                }
                if (verLateral)
                {
                    codigo += "side true ";
                }
                else
                {
                    codigo += "side false ";
                }
                codigo += "} } ] }";
            }
            else
            {
                codigo = "Transform { translation" + String.Format(" {0} {1} {2} ", base.posicionX, base.posicionY, base.posicionZ);
                if (base.ejeRotacion == 'X')
                {
                    codigo += String.Format("rotation 1 0 0 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                else if (base.ejeRotacion == 'Y')
                {
                    codigo += String.Format("rotation 0 1 0 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                else if (base.ejeRotacion == 'Z')
                {
                    codigo += String.Format("rotation 0 0 1 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                else
                {
                    codigo += String.Format("rotation 0 0 0 {0} ", base.anguloRotacion);
                }
                codigo += String.Format("scale {0} {1} {2} ", base.escalaX, base.escalaY, base.escalaZ);
                codigo += "children	[ Shape{ appearance Appearance{	material Material { ";
                codigo += String.Format("transparency {0} ", base.transparencia);
                codigo += "} texture ImageTexture { ";
                codigo += String.Format("url \"{0}\"  ", base.Imagen);
                if (repetirImagenHorizontal)
                {
                    codigo += "repeatS true ";
                }
                else
                {
                    codigo += "repeatS false ";
                }
                if (repetirImagenVertical)
                {
                    codigo += "repeatT true ";
                }
                else
                {
                    codigo += "repeatT false ";
                }
                codigo += "} } geometry Cone{ ";
                codigo += String.Format("height {0} ", alto);
                codigo += String.Format("bottomRadius {0} ", radio);
                if (verParteInferior)
                {
                    codigo += "bottom true ";
                }
                else
                {
                    codigo += "bottom false ";
                }
                if (verLateral)
                {
                    codigo += "side true ";
                }
                else
                {
                    codigo += "side false ";
                }
                codigo += "} } ] }";
            }
            codigo = codigo.Replace(",", ".");
            return codigo;
        }
    }
}

/*
Transform
{
	translation 0 -1 0      
    rotation 0  0  0  0 
    scale 0  0  0 
	children
	[	
	Shape{  
		appearance Appearance{  
			material Material {
								diffuseColor 0.20 0.4 0.19
								emissiveColor 0.20 0.3 0.19
                                specularColor 0 0 0
                                ambientIntensity 0
                                shininess 0
                                transparency 0  
								}  
		   }  
			geometry Cone{   
                             height         altura   
                             bottomRadius   radio_de_la_base  
                             bottom         valor_lógico  
                             side           valor_lógico  
            } 	   
		}
	]
}  
 
Mediante los campos bottom y side se indica si se desea dibujar la base y la superfice lateral respectivamente. 
Por defecto estos campos toman el valor TRUE, lo cual indica que se dibuja el cono completo. 
 */
